package inmobiliaria.frsf.action;

import inmobiliaria.frsf.bo.ColeccionesComunesBO;
import inmobiliaria.frsf.bo.InmuebleBO;
import inmobiliaria.frsf.bo.impl.ColeccionesComunesBOImpl;
import inmobiliaria.frsf.bo.impl.InmuebleBOImpl;
import inmobiliaria.frsf.bo.impl.VentaBOImpl;
import inmobiliaria.frsf.enums.EstadoInmuebleEnum;
import inmobiliaria.frsf.enums.OrientacionEnum;
import inmobiliaria.frsf.enums.TipoInmuebleEnum;
import inmobiliaria.frsf.model.Calle;
import inmobiliaria.frsf.model.DatosAdicionales;
import inmobiliaria.frsf.model.Domicilio;
import inmobiliaria.frsf.model.Inmueble;
import inmobiliaria.frsf.model.Localidad;
import inmobiliaria.frsf.model.Persona;
import inmobiliaria.frsf.model.Propietario;
import inmobiliaria.frsf.model.Provincia;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class InmuebleAction extends ActionSupport{

	/**
	 * 
	 */
	private static final long serialVersionUID = -6017281218471739206L;
	/**
	 * Constante para redirección.
	 */
	public static final String HOME = "home";
	public static final String ABRIR_ALTA = "altaInmueble";
	public static final String ABRIR_EDITAR = "edicionInmueble";
	public static final String ABRIR_CONSULTA = "consultaInmueble";
	public static final String GESTION_INMUEBLE = "gestionInmueble";
	
	private static final Integer ID_PROVINCIA_SANTA_FE = 20;
	private static final Integer ID_LOCALIDAD_SANTA_FE = 4;
	
	/**
	 * BO de colecciones comunes
	 */
	private ColeccionesComunesBO coleccionesComunesBO = new ColeccionesComunesBOImpl();
	
	/**
	 * BO de inmueble
	 */
	private InmuebleBO inmuebleBO = new InmuebleBOImpl();

	/**
	 * Entidad de inmueble
	 */
	public Inmueble inmueble = new Inmueble();

	/**
	 * Lista de inmuebles
	 */
	public List<Inmueble> inmuebles = new ArrayList<Inmueble>();
	
	/**
	 * Lista los tipos de inmueble
	 */
	public List<TipoInmuebleEnum> tiposInmueble = new ArrayList<TipoInmuebleEnum>();

	/**
	 * Lista los estados de inmueble
	 */
	public List<EstadoInmuebleEnum> estadosInmueble = new ArrayList<EstadoInmuebleEnum>();
	
	/**
	 * Lista las orientaciones de un inmueble
	 */
	public List<OrientacionEnum> orientaciones = new ArrayList<OrientacionEnum>();
	
	/**
	 * Lista con provincias
	 */
	public List<Provincia> provincias = new ArrayList<Provincia>();

	/**
	 * Lista con provincias
	 */
	public List<Localidad> localidades = new ArrayList<Localidad>();

	/**
	 * Lista con provincias
	 */
	public List<Calle> calles = new ArrayList<Calle>();
	
	/**
	 * Lista con provincias
	 */
	public String fechaAlta = "";
	
	/**
	 * Lista de Personas
	 */
	public List<Persona> personas = new ArrayList<Persona>();

	/**
	 * id de Persona seleccionada como propietario
	 */
	public Integer idPersona;
	
	/**
	 * BO de venta
	 */
	public VentaBOImpl ventaBO = new VentaBOImpl();
	
	/**
	 * Filtros grilla
	 */
	public String idTipoInmueble = "";
	public String idEstadoInmueble = "";
	public String barrio = "";
	public String ciudad = "";
	public String precioDesde = "";
	public String precioHasta = "";
	
	public String nuevaLocalidad = "";
	public String nuevaCalle = "";
	
	@Override
	public String execute() throws Exception {
		return HOME;
	}

	public String abrirGestionInmueble() throws Exception {
		
		// Completo el combo de tipo de inmueble y de las distintas orientaciones
		this.tiposInmueble = TipoInmuebleEnum.getList();
		ServletActionContext.getRequest().getSession().setAttribute("tiposInmueble", this.tiposInmueble);
		this.estadosInmueble = EstadoInmuebleEnum.getList();
		ServletActionContext.getRequest().getSession().setAttribute("estadosInmueble", this.estadosInmueble);
		this.orientaciones = OrientacionEnum.getList();
		ServletActionContext.getRequest().getSession().setAttribute("orientaciones", this.orientaciones);
		this.provincias = coleccionesComunesBO.getProvincias();
		
		ServletActionContext.getRequest().getSession().setAttribute("provincias", this.provincias);
		ServletActionContext.getRequest().getSession().removeAttribute("localidad");
		ServletActionContext.getRequest().getSession().removeAttribute("calle");
		
		List<Inmueble> inmuebles = inmuebleBO.searchInmueble(null, null, null, null, null, null, null);
		setInmuebles(inmuebles);
		
		ServletActionContext.getRequest().setAttribute("totalResults", inmuebles.size());
		ServletActionContext.getRequest().setAttribute("pageSize", 5);

		return GESTION_INMUEBLE;
	}
	
	/**
	 * Se encarga de abrir la pantalla de alta de inmueble.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String abrirAlta() throws Exception {
		this.personas = ventaBO.searchClientes();
		ServletActionContext.getRequest().getSession().setAttribute("personas", this.personas);
		
		this.inmueble.getDomicilio().getCalle().getLocalidad().getProvincia().setId(ID_PROVINCIA_SANTA_FE);
		this.inmueble.getDomicilio().getCalle().getLocalidad().setIdLocalidad(ID_LOCALIDAD_SANTA_FE);
		buscarLocalidades();
		buscarCalles();

		return ABRIR_ALTA;
	}
	
	/**
	 * Se encarga de guardar el alta de un inmueble.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String guardar() throws Exception {
		try {
			personas = (List<Persona>) ServletActionContext.getRequest().getSession().getAttribute("personas");
			
			Propietario propietario = new Propietario();
			for(Persona p : personas)
			{
				if(p.getIdPersona().equals(this.idPersona))
				{
					propietario = new Propietario(p);
					break;
				}
			}
			
			inmueble.setFechaAlta(Calendar.getInstance());
			inmueble.setEstado(EstadoInmuebleEnum.DISPONIBLE.getId());
			inmueble.setPropietario(propietario);
			
			if (inmueble.getDomicilio().getCalle().getLocalidad()
					.getIdLocalidad() == -1) {
				Localidad localidad = (Localidad) ServletActionContext
						.getRequest().getSession().getAttribute("localidad");
				inmueble.getDomicilio().getCalle().getLocalidad()
						.setNombre(localidad.getNombre());
			}
	
			// Guardar Calle
			if (inmueble.getDomicilio().getCalle().getId() == -1) {
				Calle calle = (Calle) ServletActionContext.getRequest()
						.getSession().getAttribute("calle");
				inmueble.getDomicilio().getCalle()
						.setNombre(calle.getNombre());
			}
			inmuebleBO.guardar(inmueble);
			ServletActionContext.getRequest().setAttribute("resultado", "OK");
			}
		catch (Exception e) {
			ServletActionContext.getRequest().setAttribute("resultado", "ERROR");
		}
		return abrirGestionInmueble();
	}
	
	/**
	 * Se encarga de guardar la modificación de un inmueble.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String guardarEdicion() throws Exception {
		try {
				Inmueble inmuebleOriginal = (Inmueble) ServletActionContext.getRequest().getSession().getAttribute("inmueble");
				inmuebleOriginal.getDatos().setAguaCorriente(inmueble.getDatos().isAguaCorriente());
				inmuebleOriginal.getDatos().setAntiguedad(inmueble.getDatos().getAntiguedad());
				inmuebleOriginal.getDatos().setBanios(inmueble.getDatos().getBanios());
				inmuebleOriginal.getDatos().setCloacas(inmueble.getDatos().isCloacas());
				inmuebleOriginal.getDatos().setCocheraM2(inmueble.getDatos().getCocheraM2());
				inmuebleOriginal.getDatos().setDormitorios(inmueble.getDatos().getDormitorios());
				inmuebleOriginal.getDatos().setFondoM(inmueble.getDatos().getFondoM());
				inmuebleOriginal.getDatos().setFrenteM(inmueble.getDatos().getFrenteM());
				inmuebleOriginal.getDatos().setGasNatural(inmueble.getDatos().isGasNatural());
				inmuebleOriginal.getDatos().setLineaTelefonica(inmueble.getDatos().isLineaTelefonica());
				inmuebleOriginal.getDatos().setObservaciones(inmueble.getDatos().getObservaciones());
				inmuebleOriginal.getDatos().setOrientacion(inmueble.getDatos().getOrientacion());
				inmuebleOriginal.getDatos().setPatioM2(inmueble.getDatos().getPatioM2());
				inmuebleOriginal.getDatos().setPavimento(inmueble.getDatos().isPavimento());
				inmuebleOriginal.getDatos().setPiscina(inmueble.getDatos().isPiscina());
				inmuebleOriginal.getDatos().setPisos(inmueble.getDatos().getPisos());
				inmuebleOriginal.getDatos().setSuperficieTotalM2(inmueble.getDatos().getSuperficieTotalM2());
				inmuebleOriginal.getDomicilio().setBarrio(inmueble.getDomicilio().getBarrio());
				inmuebleOriginal.getDomicilio().setDepartamento(inmueble.getDomicilio().getDepartamento());
				inmuebleOriginal.getDomicilio().setDetalle(inmueble.getDomicilio().getDetalle());
				inmuebleOriginal.getDomicilio().setNumero(inmueble.getDomicilio().getNumero());
				inmuebleOriginal.getDomicilio().setPiso(inmueble.getDomicilio().getPiso());
				inmuebleOriginal.setTipoInmueble(inmueble.getTipoInmueble());
				inmuebleOriginal.setPrecioVenta(inmueble.getPrecioVenta());
				
				Localidad localidad = (Localidad) ServletActionContext.getRequest().getSession().getAttribute("localidad");
				if (inmueble.getDomicilio().getCalle().getLocalidad().getIdLocalidad() == -1) {					
					inmuebleOriginal.getDomicilio().getCalle().getLocalidad().setIdLocalidad(inmueble.getDomicilio().getCalle().getLocalidad().getIdLocalidad());
					inmuebleOriginal.getDomicilio().getCalle().getLocalidad().setNombre(localidad.getNombre());
					inmuebleOriginal.getDomicilio().getCalle().getLocalidad().getProvincia().setId(localidad.getProvincia().getId());
				}else{
					inmuebleOriginal.getDomicilio().getCalle().getLocalidad()
						.setIdLocalidad(inmueble.getDomicilio().getCalle().getLocalidad().getIdLocalidad());
					if(localidad != null)
						inmuebleOriginal.getDomicilio().getCalle().getLocalidad().getProvincia().setId(localidad.getProvincia().getId());
				}
		
				// Guardar Calle
				Calle calle = (Calle) ServletActionContext.getRequest().getSession().getAttribute("calle");
				if(calle != null){
					if (calle.getId() == -1) {
						inmuebleOriginal.getDomicilio().getCalle().setNombre(calle.getNombre());
						inmuebleOriginal.getDomicilio().getCalle().setId(calle.getId());
					}
					else
					{
						inmuebleOriginal.getDomicilio().getCalle().setId(calle.getId());
					}
				}
				
				inmuebleBO.guardarEdicion(inmuebleOriginal);
				ServletActionContext.getRequest().setAttribute("resultadoEdicion", "OK");
			}
		catch (Exception e) {
			ServletActionContext.getRequest().setAttribute("resultadoEdicion", "ERROR");
		}
		return abrirGestionInmueble();
	}
	
	public String consultar() throws Exception {
		
		this.tiposInmueble = TipoInmuebleEnum.getList();
		this.estadosInmueble = EstadoInmuebleEnum.getList();
		this.orientaciones = OrientacionEnum.getList();
		
		String[] params = (String[]) ActionContext.getContext().getParameters().get("id");
		List<Inmueble> inmuebles = inmuebleBO.searchInmueble(params[0].toString(), null, null, null, null, null, null);			
		this.inmueble = inmuebles.get(0);	
		personas = new ArrayList<Persona>();
		personas.add(inmueble.getPropietario());
		ServletActionContext.getRequest().getSession().setAttribute("personas", this.personas);
		
		buscarLocalidades();
		buscarCalles();

		return ABRIR_CONSULTA;
	}
	
	/**
	 * Se encarga de abrir la pantalla de modificación de inmueble.
	 * 
	 * @return
	 * @throws Exception
	 */	
	public String editar() throws Exception {
		this.tiposInmueble = TipoInmuebleEnum.getList();
		ServletActionContext.getRequest().getSession().setAttribute("tiposInmueble", this.tiposInmueble);
		
		this.orientaciones = OrientacionEnum.getList();
		ServletActionContext.getRequest().getSession().setAttribute("orientaciones", this.orientaciones);
		this.provincias = coleccionesComunesBO.getProvincias();
		
		ServletActionContext.getRequest().getSession().setAttribute("provincias", this.provincias);
		ServletActionContext.getRequest().getSession().removeAttribute("localidad");
		ServletActionContext.getRequest().getSession().removeAttribute("calle");		
		
		String[] params = (String[]) ActionContext.getContext().getParameters().get("id");
		List<Inmueble> inmuebles = inmuebleBO.searchInmueble(params[0].toString(), null, null, null, null, null, null);
		this.inmueble = inmuebles.get(0);
		ServletActionContext.getRequest().getSession().setAttribute("inmueble", this.inmueble);
		
		personas = new ArrayList<Persona>();
		personas.add(inmueble.getPropietario());
		ServletActionContext.getRequest().getSession().setAttribute("personas", this.personas);
	
		estadosInmueble = new ArrayList<EstadoInmuebleEnum>();
		estadosInmueble.add(EstadoInmuebleEnum.getList().get(inmueble.getEstado()));
		ServletActionContext.getRequest().getSession().setAttribute("estadosInmueble", this.estadosInmueble);
		
		fechaAlta = inmueble.getFechaAltaString();
		ServletActionContext.getRequest().getSession().setAttribute("fechaAlta", this.fechaAlta);
		
		buscarLocalidades();
		buscarCalles();
		
		return ABRIR_EDITAR;
	}
	
	/**
	 * Se encarga de abrir la pantalla de baja de inmueble.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String eliminar() throws Exception {
		try{
			String[] params = (String[]) ActionContext.getContext().getParameters()
					.get("id");
	
			inmuebleBO.eliminar(Integer.valueOf(params[0].toString()));
			return abrirGestionInmueble();
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
		
	}

	/**
	 * Realiza el filtrado de la grilla de propietarios.
	 * 
	 * @return
	 * @throws Exception
	 */
	public String filtrarGrilla() throws Exception {
		
		List<Inmueble> inmuebles = inmuebleBO.searchInmueble(null, idTipoInmueble, idEstadoInmueble, barrio, ciudad,
				precioDesde, precioHasta);
		setInmuebles(inmuebles);
		
		ServletActionContext.getRequest().setAttribute("totalResults", inmuebles.size());
		ServletActionContext.getRequest().setAttribute("pageSize", 5);

		
		return GESTION_INMUEBLE;
	}

	
	/**
	 * Actualiza el combobox de Localidades en la pantalla Alta.
	 * 
	 * @return
	 */
	public String actualizarLocalidadesAlta() {
		try {
			buscarLocalidades();
			buscarCalles();
			return ABRIR_ALTA;
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}
	
	/**
	 * Actualiza el combobox de Localidades en la pantalla Edicion.
	 * 
	 * @return
	 */
	public String actualizarLocalidadesEdicion() {
		try {
			buscarLocalidades();
			buscarCalles();
			fechaAlta = (String) ServletActionContext.getRequest().getSession().getAttribute("fechaAlta");
			return ABRIR_EDITAR;
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	/**
	 * Mentodo encargado de obtener las Localidades pertenecientes a una
	 * Provincia
	 * 
	 * @throws Exception
	 */
	private void buscarLocalidades() throws Exception {

		if (this.inmueble.getDomicilio().getCalle().getLocalidad()
				.getProvincia().getId() != null) {
			this.localidades = coleccionesComunesBO.getLocalidades(Long
					.parseLong(this.inmueble.getDomicilio().getCalle()
							.getLocalidad().getProvincia().getId().toString()));
		} else {
			this.localidades = coleccionesComunesBO.getLocalidades(Long
					.parseLong(ID_PROVINCIA_SANTA_FE.toString()));
			//this.inmueble.getDomicilio().getCalle().getLocalidad().setIdLocalidad(ID_LOCALIDAD_SANTA_FE);
		}

		Localidad localidad = (Localidad) ServletActionContext.getRequest().getSession().getAttribute("localidad");
		if (localidad != null) {
			this.localidades.add(0, localidad);

		}
	}

	/**
	 * Agrega la localidad en el combo de localidades.
	 * 
	 * @return
	 */
	public String agregarLocalidadAlta() {
		try {
			Localidad localidad = new Localidad();
			localidad.setIdLocalidad(-1);
			localidad.setNombre(this.nuevaLocalidad);

			buscarLocalidades();

			this.localidades.add(0, localidad);
			this.inmueble.getDomicilio().getCalle().getLocalidad()
					.setIdLocalidad(-1);

			ServletActionContext.getRequest().getSession()
					.setAttribute("localidad", localidad);

			return ABRIR_ALTA;

		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	/**
	 * Agrega la localidad en el combo de localidades.
	 * 
	 * @return
	 */
	public String agregarLocalidadEditar() {
		Localidad localidad = new Localidad();
		localidad.setIdLocalidad(-1);
		localidad.setNombre(this.nuevaLocalidad);

		this.localidades.add(0, localidad);

		localidad.getProvincia().setId(this.inmueble.getDomicilio().getCalle().getLocalidad()
				.getProvincia().getId());

		ServletActionContext.getRequest().getSession()
				.setAttribute("localidad", localidad);

		fechaAlta = (String) ServletActionContext.getRequest().getSession().getAttribute("fechaAlta");
		
		return ABRIR_EDITAR;
	}
	
	/**
	 * Agrega la calle en el combo de calles.
	 * 
	 * @return
	 */
	public String agregarCalleEditar() {
		try {
			Calle calle = new Calle();
			calle.setId(-1);
			calle.setNombre(this.nuevaCalle);
			buscarLocalidades();
			buscarCalles();
			this.calles.add(0, calle);
			this.inmueble.getDomicilio().getCalle().setId(-1);

			ServletActionContext.getRequest().getSession()
					.setAttribute("calle", calle);
			
			fechaAlta = (String) ServletActionContext.getRequest().getSession().getAttribute("fechaAlta");
			
			return ABRIR_EDITAR;

		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	/**
	 * Agrega la calle en el combo de calles.
	 * 
	 * @return
	 */
	public String agregarCalleAlta() {
		try {
			Calle calle = new Calle();
			calle.setId(-1);
			calle.setNombre(this.nuevaCalle);
			buscarLocalidades();
			buscarCalles();
			this.calles.add(0, calle);
			this.inmueble.getDomicilio().getCalle().setId(-1);

			ServletActionContext.getRequest().getSession()
					.setAttribute("calle", calle);

			return ABRIR_ALTA;

		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	/**
	 * Actualiza el combobox de Localidades en la pantalla Alta.
	 * 
	 * @return
	 */
	public String actualizarCallesAlta() {
		try {
			buscarLocalidades();
			buscarCalles();
			return ABRIR_ALTA;
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}
	
	/**
	 * Actualiza el combobox de Localidades en la pantalla Editar
	 * 
	 * @return
	 */
	public String actualizarCallesEditar() {
		try {
			buscarLocalidades();
			buscarCalles();
			fechaAlta = (String) ServletActionContext.getRequest().getSession().getAttribute("fechaAlta");
			return ABRIR_EDITAR;
		} catch (Exception e) {
			e.printStackTrace();
			return ERROR;
		}
	}

	public void buscarCalles() throws Exception {
		if (this.inmueble.getDomicilio().getCalle().getLocalidad()
				.getIdLocalidad() != null && localidades != null && !localidades.isEmpty()) {
			this.calles = coleccionesComunesBO.getCalles(this.inmueble
					.getDomicilio().getCalle().getLocalidad().getIdLocalidad());
		} else {
			if (localidades != null && !localidades.isEmpty() && localidades.get(0) != null) {
				this.calles = coleccionesComunesBO.getCalles(localidades.get(0).getIdLocalidad());
			}
		}
	}	
	
	/**
	 * @param propietarioBO
	 *            the propietarioBO to set
	 */
	public void setInmuebleBO(InmuebleBO inmuebleBO) {
		this.inmuebleBO = inmuebleBO;
	}

	/**
	 * @return the personas
	 */
	public List<Persona> getPersonas() {
		return personas;
	}

	/**
	 * @param personas the personas to set
	 */
	public void setPersonas(List<Persona> personas) {
		this.personas = personas;
	}

	public Inmueble getInmueble() {
		return inmueble;
	}


	public void setInmueble(Inmueble inmueble) {
		this.inmueble = inmueble;
	}


	public List<Inmueble> getInmuebles() {
		return inmuebles;
	}


	public void setInmuebles(List<Inmueble> inmuebles) {
		this.inmuebles = inmuebles;
	}


	public List<TipoInmuebleEnum> getTiposInmueble() {
		return tiposInmueble;
	}


	public void setTiposInmueble(List<TipoInmuebleEnum> tiposInmueble) {
		this.tiposInmueble = tiposInmueble;
	}


	public List<EstadoInmuebleEnum> getEstadosInmueble() {
		return estadosInmueble;
	}


	public void setEstadosInmueble(List<EstadoInmuebleEnum> estadosInmueble) {
		this.estadosInmueble = estadosInmueble;
	}


	public List<OrientacionEnum> getOrientaciones() {
		return orientaciones;
	}


	public void setOrientaciones(List<OrientacionEnum> orientaciones) {
		this.orientaciones = orientaciones;
	}


	public String getIdTipoInmueble() {
		return idTipoInmueble;
	}


	public void setIdTipoInmueble(String idTipoInmueble) {
		this.idTipoInmueble = idTipoInmueble;
	}


	public String getIdEstadoInmueble() {
		return idEstadoInmueble;
	}


	public void setIdEstadoInmueble(String idEstadoInmueble) {
		this.idEstadoInmueble = idEstadoInmueble;
	}


	public String getBarrio() {
		return barrio;
	}


	public void setBarrio(String barrio) {
		this.barrio = barrio;
	}


	public String getCiudad() {
		return ciudad;
	}


	public void setCiudad(String ciudad) {
		this.ciudad = ciudad;
	}


	public String getPrecioDesde() {
		return precioDesde;
	}


	public void setPrecioDesde(String precioDesde) {
		this.precioDesde = precioDesde;
	}


	public String getPrecioHasta() {
		return precioHasta;
	}


	public void setPrecioHasta(String precioHasta) {
		this.precioHasta = precioHasta;
	}

	/**
	 * @return the idPersona
	 */
	public Integer getIdPersona() {
		return idPersona;
	}

	/**
	 * @param idPersona the idPersona to set
	 */
	public void setIdPersona(Integer idPersona) {
		this.idPersona = idPersona;
	}
}
